﻿/*
6.2 基础控件
（1)按钮类：QPushButton普通按钮、QToolButton工具按钮、QCheckBox复选框、QRadioButton单选按钮
QPushButton可以设置文本也可以设置图标，另外还可以给QPushButton设置菜单。
QToolButton可以只设置图标,可以设置文本，需要使用setToolButtonStyle指定图标或文本的位置关系（否则文本不显示），其主要配合QToolBar来使用。点击时需要绑定clicked信号（不是triggered信号）
（2）按钮组控件QButtonGroup
当有一组按钮时，这组按钮共用一个槽函数，需要在该槽函数中做出判断逻辑，此时可以使用QButtonGroup，它把相同的功能的一组按钮整体管理。
QButtonGroup的常用方法：
  a、添加按钮并设置id:addButtton();
  b、获取按钮button()
  c、setExclusive()设置互斥，同一时刻只能选择某个按钮
  d、信号：buttonClicked()点击按钮组中某个按钮时发出该信号
（3）输入类控件
 A、组合框也称下拉框，用于提供一组下拉选项供用户选择，此外它还可以输出内容。
 组合框常用函数：
 currentIndex()，返回当前项的下标（下标从0开始）
 currentText(),返回当前项的文本
 currentData(),返回当前项的用户数据
count()获取下拉项的个数。
信号：当一个组合框下拉项发送变化时，会发出如下信号
a、currentIndexChanged(int index)
b、currentIndexChanged(QString text)
B、QLineEdit行编辑器
 QLineEdit是一个单行文本编辑器，它运行用户输入和编辑单行文本内容，而且提供了一系列有用的功能，例如复制、粘贴、撤销等。
 （1）显示模式
	   Normal正常模式，输入的内容正常显示
	   NoEcho，不显示任何输入
	   Password密码模式，输入的内容显示为小黑点或星号
	   PasswordEchoOnEdit，输入时正常显示内容，否则显示为密码模式
  （2）focusPolicy焦点策略（控件如何获取焦点）
	  Qt::TabFocus 控件通过按下Tab键获取焦点
	  Qt::ClickFocus 控件通过鼠标单击获取焦点
	  Qt::StrongFocus 控件通过按下Tab键或鼠标单击获取焦点
	  Qt::NoFocus 控件不接受焦点
	  Qt::WheelFocus控件通过滚动鼠标滚轴获取焦点
   （3）正则表达式
       正则表达式（Regular Expression，简写Regexp）是一种文本模式，它使用单个字符串来描述、匹配一系列满足某个语法规则的字符串，
	   通常被用来检索或替换那些符合语法规则的文本（字符串）。
	   正则表达式由表达式、量词和断言组成。例如，想要表示A-C的任意字符，可以用正则表达式 [ABC],中括号表示范围，此正则表达式可以简写为
	   [A-C]。想表示0至9的任意数字[0-9]。一个量词指定了必须要匹配的表达式出现的次数。量词一般用{m,n}表示，意思是：至少出现m次，至多出现n次。
	   例如：x{1,1}正则表达式匹配一个字符x,可以简写为x{1}。
	   练习：编写正则表达式匹配0到99之间的整数[0-9]{1,2}, "hellon你好22世界world"。
	   断言是一些列符号，用于限制正则表达式，最常用的^,从字符串开始进行匹配（例如，上面匹配0-99整数，必须以数字开头），$表示匹配到字符串的末尾
	   （例如，上面匹配0-99整数，必须以数字结尾）。表示0到99之间的整数正则表达式是： ^[0-9]{1,2}$
	   a、正则表达式中的字符和字符集
	   一般可以使用一些特殊的符号来表示场景的字符组和量词。 ^[0-9]{1,2}$ 可以改写为 ^\d{1,2}$    x{1}可以改写为x
	   b、正则表达式中的量词
	   c、正则表达式中的通配符
	(4)	QLineEdit的信号
	  a、editingFinished，当编辑框输入完毕（按下回车键或者失去焦点）时发出该信号
	  b、textChanged，当文本内容改变时发出该信号，以编程方式（调用setText）改变文本内容时发出该信号
	  c、textEdited,当编辑文本内容时发出该信号，以编程方式（调用setText）改变文本内容时不发出该信号
C、QTextEdit文本块编辑框
   它除了可以显示文本，还可以显示图像、列表和表格。
      QTextEdit继承自QAbstractScrollArea，当文本信息超出QTextEdit的显示范围时，可以自动出滚动条。
	常用方法或槽函数：
	  （1）setPlainText()，给文本块控件设置文本，每次设置时清空之前的文本内容
	  （2）insertPlainText(),给文本块控件插入文本，不清空之前的文本内容
	  （3）toPainText()获取文本内容
D、QTimeEdit、QDateEdit、QDateTimeEdit
     （1）QString转为QTime、QDate或QDateTime类型，fromString()，注意显示格式
	 （2）将QTime、QDate和QDateTime转为QString类型,toString()，注意显示格式
E、QScrollBar用于创建水平或竖直滚动条，允许用户访问比显示范围大的窗口内容。滚动条通常搭配其他控件使用，不单独使用。
F、QSlider滑动条控件
   QSlider提供了水平或垂直滑动条（一般表示一个范围区域）。
   常用函数：
   （1）setValue用来设置滑块的当前值
   （2）setRange用来设置滑块的取值范围
   （3）setMinimum()和setMaximum()设置滑动条的最小值和最大值
   （4）setTickPosition()表示刻度标记的位置
   （5）setTickInterval()一个刻度表示的值
 
*/

#include "Qt8ButtonsApp.h"
#include <QMenu>
#include <QAction>
#include <QMessageBox>
#include <QDebug>
#include <QButtonGroup>
#include <QRegularExpression>
#include <QRegularExpressionValidator>
#include <QCompleter>
#include <QDateTime>
#include <QDate>
#include <QTime>
#include <QScrollBar>

Qt8ButtonsApp::Qt8ButtonsApp(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);

	QIcon icon(":/Qt8ButtonsApp/image/1.png");
	ui.btnHello->setIcon(icon);

	QMenu *menu = new QMenu(this);
	QAction *action = new QAction(QStringLiteral("弹出"));
	menu->addAction(action);
	ui.btnMenu->setMenu(menu);

	// 设置复选框初始为勾选状态
	ui.checkBoxRead->setCheckable(false);  // 设置复选框不可勾选
	// 以下两句设置复选框为勾选状态
	ui.checkBoxRun->setChecked(true);
	ui.checkBoxGame->setCheckState(Qt::Checked);
	connect(ui.checkBoxGame, &QCheckBox::stateChanged, this, &Qt8ButtonsApp::checkBoxStateChangeSlot);
	// 开启复选框三态
	//ui.checkBoxGame->setTristate(true);

	m_pButtonGroup = new QButtonGroup(this);
	m_pButtonGroup->addButton(ui.radioButtonFemale, 0);
	m_pButtonGroup->addButton(ui.radioButtonMale, 1);
	//connect(m_pButtonGroup, &QButtonGroup::buttonClicked, this, &Qt8ButtonsApp::buttonClickedSlot);
	connect(m_pButtonGroup, SIGNAL(buttonClicked(int)), this, SLOT(buttonClickedSlot(int)));

	//// 组合框添加下拉选项，方式1
	//ui.cbxProvince->addItem(QStringLiteral("陕西省"));
	//ui.cbxProvince->addItem(QStringLiteral("四川省"));
	//ui.cbxProvince->addItem(QStringLiteral("贵州省"));
	//ui.cbxProvince->clear();

	//// 组合框添加下拉选项，方式2
	//QStringList provinceList;
	//provinceList << QString::fromLocal8Bit("山西省") << QString::fromLocal8Bit("山东省") << QString::fromLocal8Bit("河南省") << QString::fromLocal8Bit("河北省");
	//ui.cbxProvince->addItems(provinceList); // 批量添加方式，只能添加字符串
	//ui.cbxProvince->clear();

	//// 组合框添加下拉选项，方式3：下拉项包含图标ICon和字符串
	//QIcon icon1(":/Qt8ButtonsApp/image/1.png");
	//QIcon icon2;
	//icon2.addFile(":/Qt8ButtonsApp/image/2.png");
	//ui.cbxProvince->addItem(icon1, QStringLiteral("上海市"));
	//ui.cbxProvince->addItem(icon2, QStringLiteral("重庆市"));
	//ui.cbxProvince->clear();

	// 方式4：组合框中添加具有用户数据的下拉项
	QMap<QString, int> cityZoneMap;
	cityZoneMap.insert(QStringLiteral("北京市"), 100);
	cityZoneMap.insert(QStringLiteral("天津市"), 200);
	cityZoneMap.insert(QStringLiteral("石家庄市"), 300);
	cityZoneMap.insert(QStringLiteral("济南市"), 400);
	for each(const QString &key in cityZoneMap.keys())
	{
		ui.cbxProvince->addItem(key, cityZoneMap.value(key));
	}

	connect(ui.cbxProvince, SIGNAL(currentIndexChanged(int)), this, SLOT(provinceComboBoxItemChangeSlot(int)));

	// 字体组合框,设置当前字体为楷体
	//ui.fontComboBox->setCurrentFont(QFont(QStringLiteral("楷体")));

	// 设置字体过滤器，可以过滤：（1）显示所有字体 （2）显示可缩放字体 （3）显示不可缩放字体 （4）显示等宽字体 （5）显示比例字体
	ui.fontComboBox->setFontFilters(QFontComboBox::ScalableFonts);
	QFont font = ui.fontComboBox->currentFont();
	ui.labelFont->setFont(font);

	initLineEdit();
	initTextEdit();

	// 给日期和日期时间控件设置显示日历
	ui.dateEdit->setCalendarPopup(true);
	ui.dateTimeEdit->setCalendarPopup(true);

 //   //当前窗口设置为框800，高400
	//this->setGeometry(0, 0, 800, 600);
	////创建水平滚动条
	//m_pHorizontalScrollBar = new QScrollBar(Qt::Horizontal, this);
	//m_pHorizontalScrollBar->setGeometry(0, 450, 800, 30);
	//// 创建垂直滚动条
	//m_pVerticalScrollBar = new QScrollBar(Qt::Vertical, this);
	//m_pVerticalScrollBar->setGeometry(600, 0, 30, 400);

	// 操作水平滑动条

}

Qt8ButtonsApp::~Qt8ButtonsApp()
{}

void Qt8ButtonsApp::initLineEdit()
{
	// 设置显示模式
	ui.lineEditPhone->setEchoMode(QLineEdit::Normal);
	//ui.lineEditName->setText("zhangsan");
	// 设置输入内容前的静态提示信息
	ui.lineEditName->setPlaceholderText(QString::fromLocal8Bit("请输入用户名/手机号"));
	ui.lineEditPwd->setPlaceholderText(QString::fromLocal8Bit("请输入密码"));
	ui.lineEditPhone->setPlaceholderText(QString::fromLocal8Bit("请输入手机号"));

	// setFocusPolicy设置焦点策略
	ui.lineEditName->setFocusPolicy(Qt::StrongFocus);
	// 设置lineEdit的最大输入长度
	ui.lineEditName->setMaxLength(30);
	ui.lineEditPwd->setMaxLength(6);
	ui.lineEditPhone->setMaxLength(11);
	// 设置用户名输入的正则表达式
	QRegularExpression regName("^[0-9a-zA-Z]*$"); // 创建正则表达式对象
	QRegularExpressionValidator *pNameVat = new QRegularExpressionValidator(this); // 创建正则校验器对象
	pNameVat->setRegularExpression(regName); // 设置正则校验器的规则
	ui.lineEditName->setValidator(pNameVat);  //设置QLineEdit的校验器

	QRegularExpression regPhone("^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\\d{8}$");
	QRegularExpressionValidator *pPhoneVat = new QRegularExpressionValidator(this);
	pPhoneVat->setRegularExpression(regPhone);
	ui.lineEditPhone->setValidator(pPhoneVat);

	// 整型数校验器
	//QIntValidator *varDat = new QIntValidator(this);
	//ui.lineEditPhone->setValidator(varDat);

	// QLineEdit中输入文本的对齐方式
	ui.lineEditName->setAlignment(Qt::AlignRight);   // 输入的文本内容右对齐
	ui.lineEditPhone->setAlignment(Qt::AlignCenter);  // 居中对齐

	// 给QLineEdit增加图标
	QAction *userAction = new QAction(ui.lineEditName);
	userAction->setIcon(QIcon(":/Qt8ButtonsApp/image/4.ico"));
	ui.lineEditName->addAction(userAction, QLineEdit::LeadingPosition);
	ui.lineEditPwd->addAction(QIcon(":/Qt8ButtonsApp/image/1.png"), QLineEdit::TrailingPosition);
	// QLineEdit的自动补全功能
	QStringList strList;
	strList << "Qt" << "Qt Creator" << "Qt Manual";
	QCompleter *completer = new QCompleter(strList, this);
	completer->setCaseSensitivity(Qt::CaseInsensitive);
	ui.lineEditName->setCompleter(completer);
}

void Qt8ButtonsApp::initTextEdit()
{
	// 文本块控件
	//ui.textEdit->setPlainText(QString::fromLocal8Bit("dhgakjdhgdahgjkhadkjgh agakhg感受到抗旱"));
	//ui.textEdit->setPlainText(QString::fromLocal8Bit("1234567890"));

	//// 设置文本块控件的背景色
	//// 获取文本块的调色板
	//QPalette pal = ui.textEdit->palette();
	//// 给调色板设置画刷颜色
	//pal.setBrush(QPalette::Base, QColor("#0BE4C4"));
	//// 取消继承父类的背景样式（自动填充背景色）
	//ui.textEdit->setAutoFillBackground(true);
	//// 给TextEdit设置调色板，即完成设置背景色
	//ui.textEdit->setPalette(pal);

	//设置背景图片
	QString	strFile = "C:\\Users\\dulin\\Desktop\\testimage\\feather.jpg";
	// 获取调色板
	QPalette pal = ui.textEdit->palette();
	// 给调色板设置背景图片
	pal.setBrush(QPalette::Base,QPixmap(strFile).scaled(ui.textEdit->size()));
	// 取消继承父类的背景样式
	ui.textEdit->setAutoFillBackground(true);
	// 给TextEdit设置调色板，即完成设置背景图片
	ui.textEdit->setPalette(pal);


	ui.textEdit->insertPlainText(QString::fromLocal8Bit("dhgakjdhgdahgjkhadkjgh agakhg感受到抗旱"));
	ui.textEdit->insertPlainText(QString::fromLocal8Bit("1234567890"));
}

void Qt8ButtonsApp::on_checkBoxRead_clicked()
{
	QString strText = ui.checkBoxRead->text();
	QMessageBox::information(this, "tip", strText);
}

void Qt8ButtonsApp::on_checkBoxRun_clicked()
{

}

void Qt8ButtonsApp::checkBoxStateChangeSlot(int state)
{
	if (state == Qt::Checked)
	{
		// 将整型变量转为QString类型，例如将 10 转"10"
		QString strState = QString::number(state);
		// 将数字字符串QString转为整型数
		int nTemp = strState.toInt();
		qDebug() << nTemp;
		QMessageBox::information(this, "tip",strState);
	}
	else if (state == Qt::Unchecked)
	{
		QMessageBox::information(this, "tip", QStringLiteral("打游戏取消勾选"));
	}
	else
	{
		QMessageBox::information(this, "tip", QStringLiteral("打游戏部分勾选"));
	}
}

void Qt8ButtonsApp::on_radioButtonMale_clicked()
{
	QMessageBox::information(this, "tip", QStringLiteral("用户选择了男生"));
}

void Qt8ButtonsApp::buttonClickedSlot(int id)
{
	QString strText = m_pButtonGroup->button(id)->text();
	qDebug() << strText;

 	if (id == 0)
 	{	
		ui.label1->setText(strText);
 	}
 	else
 	{
		ui.label2->setText(strText);
 	}
}

void Qt8ButtonsApp::provinceComboBoxItemChangeSlot(int index)
{
	qDebug() <<QStringLiteral("当前项的下标：")<< ui.cbxProvince->currentIndex();
	qDebug() << QStringLiteral("当前项的文本：") << ui.cbxProvince->currentText();
	qDebug() << QStringLiteral("组合框的下拉项个数：") << ui.cbxProvince->count();
	qDebug() << QStringLiteral("组合框的用户数据：") << ui.cbxProvince->currentData();
	

	// 获取指定项的文本内容
	QString strText = ui.cbxProvince->itemText(index);
	QMessageBox::information(this, "tip", strText);
}

void Qt8ButtonsApp::on_fontComboBox_currentFontChanged(const QFont &font)
{
	// 根据用户选择的字体设置label的字体
	ui.labelFont->setFont(ui.fontComboBox->currentFont());
}

void Qt8ButtonsApp::on_btnRegexp_clicked()
{
	// 匹配1位或2位数字字符串
	QRegularExpression reg("^\\d\\d?$");
	QString strText = "2";
	qDebug()<<strText.indexOf(reg); //输出0
    // 
	strText = "5b";
	qDebug() << strText.indexOf(reg); //输出-1

	// 匹配任意字母字符
	reg.setPattern("^[a-zA-Z]+$");
	QString strCharactor = "hello";
	qDebug() <<QStringLiteral("任意字符")<< strCharactor.indexOf(reg);
}

void Qt8ButtonsApp::on_lineEditName_editingFinished()
{
	QString strText = ui.lineEditName->text();
	QMessageBox::information(this, "tip", strText);
}

void Qt8ButtonsApp::on_textEdit_textChanged()
{
	//QMessageBox::information(this, "tip", ui.textEdit->toPlainText());
	// 每次文本块中的内容改变时，移动光标到末尾
	ui.textEdit->moveCursor(QTextCursor::End);
}

void Qt8ButtonsApp::on_btnSetText_clicked()
{
	ui.textEdit->insertPlainText(QStringLiteral("每一句真情叮嘱每一次亲切鼓励都凝聚着总书记对祖国未来的真挚关怀和殷切希望"));
}

void Qt8ButtonsApp::on_btnReadDateTime_clicked()
{
	QDateTime curDateTime = QDateTime::currentDateTime();
	ui.timeEdit->setTime(curDateTime.time());
	QString strTime = curDateTime.toString("HH:mm:ss");
	ui.lineEditTime->setText(strTime);

	ui.dateEdit->setDate(curDateTime.date());
	ui.lineEditDate->setText(curDateTime.toString("dd/MM/yyyy"));

	ui.dateTimeEdit->setDateTime(curDateTime);
	ui.lineEditDateTime->setText(curDateTime.toString("dd/MM/yyyy HH:mm:ss"));

	QMessageBox::information(this, QStringLiteral("提示"), QStringLiteral("啥也没干"));
	QMessageBox::information(this, QStringLiteral("提示"), QStringLiteral("都一样"));

}

void Qt8ButtonsApp::on_btnSetTime_clicked()
{
	QString strText = ui.lineEditTime->text();
	strText.trimmed();// 去掉空格
	if (!strText.isEmpty())
	{
		QTime tm = QTime::fromString(strText, "HH:mm:ss");
		ui.timeEdit->setTime(tm);
	}
}

void Qt8ButtonsApp::on_btnSetDate_clicked()
{
	QString strText = ui.lineEditDate->text();
	strText.trimmed();// 去掉空格
	if (!strText.isEmpty())
	{
		QDate tm = QDate::fromString(strText, "yyyy/MM/dd");
		ui.dateEdit->setDate(tm);
	}
}

void Qt8ButtonsApp::on_btnSetDateTime_clicked()
{
	QString strText = ui.lineEditDateTime->text();
	strText.trimmed();// 去掉空格
	if (!strText.isEmpty())
	{
		QDateTime tm = QDateTime::fromString(strText, "yyyy/MM/dd HH:mm:ss");
		ui.dateTimeEdit->setDateTime(tm);
	}
	QMessageBox::information(this, QStringLiteral("弹出时间"),QStringLiteral("当前时间")+strText);
	QMessageBox::information(this, QStringLiteral("冲突问题"), QStringLiteral("解决当前冲突"));

	QString str1 = "hello";
	QString str3 = "world";
	QMessageBox::information(this, str1, str3);
	int i = 10;
}

void Qt8ButtonsApp::on_conflictButton_clicked()
{

	int a = 10;
	int b = 12;
	int c = a + b;
	QMessageBox::information(this,"tip",""+c);


	QString str1 = "Hello";
	QString str2 = "World";
	QString strInfo = str1 + str2;
	while (str1 == "Hello")
	{
		break;
	}
	//
	QMessageBox::information(this, QStringLiteral("吴彦祖"), QStringLiteral("吴彦祖冲突"));
	QMessageBox::information(this, QStringLiteral("海灵顿"), QStringLiteral("海灵顿冲突"));
	QMessageBox::information(this, QStringLiteral("海灵顿258"), QStringLiteral("海灵顿2222冲突"));
	QMessageBox::information(this, QStringLiteral("海灵顿258"), QStringLiteral("海灵顿3333冲突"));
	QMessageBox::information(this, QStringLiteral("杨亿"),QStringLiteral("杨亿冲突"));
	
	int x = 20;
	int y = 30;
	int sum = x + y;

	int mult = x * y;
	QMessageBox::information(this, QStringLiteral("提示"), QStringLiteral("练习解决"));
	QMessageBox::information(this, QStringLiteral("提示"), QStringLiteral("练习提交冲突解决"));
	QMessageBox::information(this, QStringLiteral("提示"), QStringLiteral("练习提交冲突解决"));
	QMessageBox::information(this, QStringLiteral("提示"), QStringLiteral("练习提交冲突解决"));
	QMessageBox::information(this, QStringLiteral("提示"), QStringLiteral("zxf提交冲突解决"));

	QMessageBox::information(this, QStringLiteral("提示"), QStringLiteral("先修改我的的，提交冲突解决"));

	QMessageBox::information(this, QStringLiteral("提示"), QStringLiteral("xyh提交冲突解决"));
	QMessageBox::information(this, QStringLiteral("提示"), QStringLiteral("啊啊xyh提交冲突解决"));
	QMessageBox::information(this, QStringLiteral("YM"), QStringLiteral("冲突Paddi"));

	
	QMessageBox::information(this, QStringLiteral("冲突2"), QStringLiteral("YM2"));
	QMessageBox::information(this, QStringLiteral("？冲突3"), QStringLiteral("YM3"));
	QMessageBox::information(this, QStringLiteral("冲突3"), QStringLiteral("修改冲突"));

}
